package models

import (
	"time"

	"gorm.io/gorm"
)

// Friend 好友关系模型
type Friend struct {
	gorm.Model
	ID       uint   `json:"id" gorm:"primaryKey"`                   // 自定义ID字段，确保JSON序列化为小写id
	UserID   uint   `json:"user_id" gorm:"not null;index"`          // 用户ID
	FriendID uint   `json:"friend_id" gorm:"not null;index"`        // 好友ID
	Status   string `json:"status" gorm:"size:20;default:'active'"` // 好友状态: active, blocked, deleted
	// 好友备注名
	Remark string `json:"remark" gorm:"size:50"`
	// 好友分组
	Group string `json:"group" gorm:"size:30;default:'默认分组'"`
	// 添加时间
	AddedAt time.Time `json:"added_at"`
}

// FriendRequest 好友请求模型
type FriendRequest struct {
	gorm.Model
	ID         uint   `json:"id" gorm:"primaryKey"`                    // 自定义ID字段，确保JSON序列化为小写id
	FromUserID uint   `json:"from_user_id" gorm:"not null;index"`      // 发送者ID
	ToUserID   uint   `json:"to_user_id" gorm:"not null;index"`        // 接收者ID
	Message    string `json:"message" gorm:"size:200"`                 // 请求消息
	Status     string `json:"status" gorm:"size:20;default:'pending'"` // 请求状态: pending, accepted, rejected, cancelled
	// 处理时间
	ProcessedAt *time.Time `json:"processed_at"`
}

// FriendWithUser 好友信息（包含用户详情）
type FriendWithUser struct {
	Friend
	User User `json:"user" gorm:"foreignKey:FriendID"`
}

// FriendRequestWithUser 好友请求信息（包含用户详情）
type FriendRequestWithUser struct {
	FriendRequest
	FromUser User `json:"from_user" gorm:"foreignKey:FromUserID"`
	ToUser   User `json:"to_user" gorm:"foreignKey:ToUserID"`
}

// 好友状态常量
const (
	FriendStatusActive  = "active"  // 正常好友
	FriendStatusBlocked = "blocked" // 已拉黑
	FriendStatusDeleted = "deleted" // 已删除
)

// 好友请求状态常量
const (
	RequestStatusPending   = "pending"   // 待处理
	RequestStatusAccepted  = "accepted"  // 已同意
	RequestStatusRejected  = "rejected"  // 已拒绝
	RequestStatusCancelled = "cancelled" // 已取消
)

// IsFriend 检查两个用户是否为好友关系
func IsFriend(userID, friendID uint) bool {
	var friend Friend
	err := GetDB().Where("user_id = ? AND friend_id = ? AND status = ?",
		userID, friendID, FriendStatusActive).First(&friend).Error
	return err == nil
}

// GetFriendsCount 获取用户好友数量
func GetFriendsCount(userID uint) int64 {
	var count int64
	GetDB().Model(&Friend{}).Where("user_id = ? AND status = ?",
		userID, FriendStatusActive).Count(&count)
	return count
}

// GetFriendRequestsCount 获取用户待处理的好友请求数量
func GetFriendRequestsCount(userID uint) int64 {
	var count int64
	GetDB().Model(&FriendRequest{}).Where("to_user_id = ? AND status = ?",
		userID, RequestStatusPending).Count(&count)
	return count
}
